변수

NOTE

셸의 명령 치환 $(...)과 변수 참조 $변수 / ${변수} 정리.

NOTE

원문을 AI가 검토·보강함(사실 확인 권장).

📌 개념

  • $(명령) : 명령 치환(command substitution) — 괄호 안 명령의 실행 결과(표준출력)를 문자열로 치환한다. 백틱 `명령` 과 동일하나 중첩이 쉬워 권장된다.
  • $변수 / ${변수} : 변수 참조 — 저장된 값을 호출한다. 중괄호는 경계를 명확히 할 때 사용(${VAR}_suffix).

💻 예시

YD="$(date -d yesterday +%Y%m%d)"   # 어제 날짜를 YYYYMMDD 로
# yesterday : 어제 / +날짜포맷
 
echo "$YD"          # 변수 값 호출 (따옴표로 공백/분할 방지)
echo "${YD}_bak"    # 중괄호로 변수 경계 지정

참고 표기

표기의미
$(cmd)명령 실행 결과로 치환
$((식))산술 연산 결과 (예: $((1+2)) → 3)
$VAR, ${VAR}변수 값 참조
"$VAR"공백/글로빙 방지를 위해 큰따옴표 권장

인용 유무에 따른 개행(newline) 보존 차이

$(...) 명령 치환 결과를 변수에 담은 뒤 다시 참조할 때, 따옴표로 감싸는지 여부에 따라 결과가 달라진다.

result=$(cat multi_line_file)
 
echo $result    # 인용 없음 → word splitting으로 공백/개행이 모두 스페이스로 붙어서 한 줄로 출력됨
echo "$result"  # 큰따옴표로 인용 → 원본의 개행(줄바꿈)이 그대로 보존되어 출력됨
  • $변수(인용 없이 사용) : 셸이 word splitting을 적용해 공백류 문자(스페이스/탭/개행)를 기준으로 단어를 분리한 뒤 다시 이어붙이므로, 여러 줄 값이 한 줄로 뭉쳐서 보임
  • "$변수"(큰따옴표로 인용) : word splitting이 일어나지 않아 원본 값(개행 포함)이 그대로 유지됨
  • 여러 줄 파일을 읽어 라인 단위로 비교/파싱해야 하는 스크립트에서 이 차이를 놓치면, 인용을 빼먹었을 때 값이 한 줄로 뭉개져 파싱 로직이 조용히 실패할 수 있다.